<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>高阶函数</title>
</head>
<body>
  <!-- 准备容器 -->
  <div id="test"></div>
  <!-- 按照顺序引入 -->
  <script type="text/javascript" src="../../js/react.development.js"></script>
  <script type="text/javascript" src="../../js/react-dom.development.js"></script>
  <script type="text/javascript" src="../../js/babel.min.js"></script>
  <script type="text/babel" >
  /*
    高阶函数
    1.若A函数接收的参数是一个函数，那么A就可以称之为高阶函数
    2.若A函数调用的返回值依然是一个函数，那么A就可以称之为高阶函数
    常见的高阶函数Promise，setTimeout，arr.map()
    函数的柯里化：通过函数调用继续返回函数的方式  实现多次接收参数  最后统一处理的函数编码形式
  */
    class Login extends React.Component {
        // 初始化状态
        state ={username:'',password:'',tel:''}
        // 修改数据到状态中
        editFormData=(data)=>{
            return (e)=>{
                console.log(data,e.target.value);
                this.setState({[data]:e.target.value})
            }
        }
        changeTel=(data,value)=>{
            this.setState({[data]:e.target.value})
        }
        handler=(event)=>{
            event.preventDefault()  // 阻止表单提交
            const {username,password} = this.state
            alert(`用户名是：${username},密码是：${password}`)
        }
        render(){
            // 事件的回調是可以寫小括號的  但是需要給事件加上返回值  返回一個函數
            return (
                <form action="http://www.baidu.com" onSubmit={this.handler}>
                    用户名：<input onChange={this.editFormData('username')} type="text" />
                    密码：<input onChange={this.editFormData('password')}  type="password" />
                    手机号：<input onChange={(e)=>{this.changeTel('tel',e.target.value)}}  />
                    <button>登录</button>
                </form>
            )
        }
    }
    ReactDOM.render(<Login/>,document.getElementById('test'))
  </script>
</body>
</html>